<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>

	<body>
		<!--方法一：使用setTimeOut来实现-->
		<script language="javascript">
			/*Javascript中暂停功能的实现 
			Javascript本身没有暂停功能（sleep不能使用）同时 vbscript也不能使用doEvents，故编写此函数实现此功能。 
			javascript作为弱对象语言，一个函数也可以作为一个对象使用。 
			比如： 
			function Test(){ 
				alert("hellow"); 
				this.NextStep=function(){ 
					alert("NextStep"); 
				} 
			} 
			我们可以这样调用 var myTest=new Test();myTest.NextStep();

			我们做暂停的时候可以吧一个函数分为两部分，暂停操作前的不变，把要在暂停后执行的代码放在this.NextStep中。 
			为了控制暂停和继续，我们需要编写两个函数来分别实现暂停和继续功能。 
			暂停函数如下： 
			*/
			function Pause(obj, iMinSecond) {
				if(window.eventList == null) window.eventList = new Array();
				// console.log(window.eventList);
				var ind = -1;
				for(var i = 0; i < window.eventList.length; i++) {
					if(window.eventList[i] == null) {
						window.eventList[i] = obj;
						ind = i;
						break;
					}
				}
				if(ind == -1) {
					ind = window.eventList.length;
					window.eventList[ind] = obj;
				}
				// console.log(window.eventList);
				setTimeout("GoOn(" + ind + ")", iMinSecond);
			}

			/* 
			该函数把要暂停的函数放到数组window.eventList里，同时通过setTimeout来调用继续函数。 
			继续函数如下： 
			*/
			function GoOn(ind) {
				// console.log(ind);
				var obj = window.eventList[ind];
				// console.log(obj);
				window.eventList[ind] = null;
				// console.log(window.eventList);
				if(obj.NextStep) obj.NextStep();
				else obj();
			}
			/* 
			该函数调用被暂停的函数的NextStep方法，如果没有这个方法则重新调用该函数。 
			函数编写完毕，我们可以作如下册是： 
			*/
			function Test() {
				console.log("hellow");
				Pause(this, 1000); //调用暂停函数  
				this.NextStep = function() {
					console.log("NextStep");
				}
			}
			Test();

			// 以下脚本完成类似功能：
			function checkuserinfo() {
				window.setTimeout(checkuses, 1000);

				function checkuses() {
					console.log("5秒后我运行");
				}
			}
			// checkuserinfo();
		</script>

		<!--方法二：使用函数闭包来实现-->
		<input type="button" value="继续" onclick='st();' />
		<script>
			/*函数*/
			function test(x) {
				console.log(x++);
				console.log(x++);
				return function() {
					console.log(x++);
					console.log(x++);
				}
			}
			var st = test(10);
			// 这是基本形式，最多是多层嵌套问题。
		</script>

		<!--方法三：正则替换-->
		<button onclick="cont()">continue</button>
		<script>
			function aa() {
				console.log("1");
				pause();
				console.log("2");
			}
			aa();
			var cont;
			function pause() {
				window.onerror = function() {
					return true;
				};
				var re = /pause(\s|.)*}/;
				var s = pause.caller.toString();
				var r = s.match(re);
				r = r[0];
				var s2 = r.replace(/pause\(\);|}/g, "");
				cont = function() {
					eval(s2);
					window.onerror = null;
				};
				throw new Error();
			}
           /*这样不能保存程序暂停时的当前状态...
			之所以用闭包是为了保存“调用堆栈”，包括所有全局和局部变量在暂停时的当前值等
			用闭包配合正则替换的原理...实现Pause()就比较完美了^^*/
		</script>
	</body>

</html>